/**  
 * @Title: BaseService.java
 * @Package rml.service
 * @date 2015年10月10日 下午1:16:32
 * @version V1.0  
 */
package com.tiger.cloud.common.mybatis;

import java.util.List;
import java.util.Map;

import com.tiger.cloud.util.MagicConstants;
import com.tiger.cloud.util.Objects;
import com.tiger.cloud.util.Page;

/**
 * 该类的功能用途 项目名称: [yfx]<br/>
 * 类名称: [BaseService]<br/>
 * 创建人: [GaoNan]<br/>
 * 创建时间: [2015年10月10日 下午1:16:32]<br/>
 * 修改人: [GaoNan]<br/>
 * 修改时间: [2015年10月10日 下午1:16:32]<br/>
 * 修改备注: [说明本次修改内容]<br/>
 * 版本: [v1.0]<br/>
 */
public abstract class TigerAdminBaseService<T extends TigerAdminBaseEntity>  implements TigerAdminBaseServiceI<T>{

	public static String generateId() {
		return new ObjectId().toHexString();
	}
	
	/**
	 * 子类需要实现该方法，提供注入的dao
	 */
	public abstract MybatisTigerAdminDao<T> getEntityDao();

	public T get(final String id) {
		return getEntityDao().get(id);
	}

	public int insert(final T entity) {
		entity.setId(generateId());
		return getEntityDao().insert(entity);
	}

	public int update(final T entity) {
		return getEntityDao().update(entity);
	}

	public int remove(final Map<String, Object> params) {
		return getEntityDao().remove(params);
	}

	public long count(Map<String, Object> params) {
		return getEntityDao().count(params);
	};

	public List<T> find(Map<String, Object> params) {
		return getEntityDao().find(params);
	}

	public List<T> findByEntity(T entity) {
		return getEntityDao().findByEntity(entity);
	}
	
	public long countByEntity(T entity) {
		return getEntityDao().countByEntity(entity);
	}
	
	public Page<T> page(Map<String, Object> params) {
		int limitStart=0,limitEnd = 10;
		Object limitStartObj=params.get(MagicConstants.LIMIT_START);
		Object limitEndObj=params.get(MagicConstants.LIMIT_END);
		if(limitStartObj!=null){
			limitStart = Objects.strToInt(limitStartObj.toString(), 0);
		}
		if(limitEndObj!=null){
			limitEnd = Objects.strToInt(limitEndObj.toString(), 15);
		}
		params.put(MagicConstants.LIMIT_START,limitStart);
		params.put(MagicConstants.LIMIT_END,limitEnd);
		long count = getEntityDao().count(params);
		Page<T> page = new Page<T>((int)(limitEnd/(limitEnd-limitStart)), (limitEnd-limitStart));
		page.setData(getEntityDao().find(params));
		page.setTotalCount(count);
		return page;
	}
	
	public T findOne(final T entity) {
		entity.setLimitStart(0);
		entity.setLimitEnd(1);
		List<T> datas = getEntityDao().findByEntity(entity);
		if (datas != null && datas.size() > 0) {
			return datas.get(0);
		}
		return null;
	}
	
	public Page<T> page(T entity,int limitStart,int pageSize) {
		Page<T> page = new Page<T>(limitStart,pageSize);
		long count = getEntityDao().countByEntity(entity);
		if(count>0){
			page.setData(getEntityDao().findByEntity(entity));
		}
		page.setTotalCount(count);
		return page;
	}

	public T findOne(Map<String, Object> params) {
		params.put(MagicConstants.LIMIT_START, 0);
		params.put(MagicConstants.LIMIT_END, 1);
		List<T> datas = getEntityDao().find(params);
		if (datas != null && datas.size() > 0) {
			return datas.get(0);
		}
		return null;
	}

}
